package web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet(value = "/demo1",loadOnStartup = 1)
public class ServletDemo1 implements Servlet {

//    private String name;

    /**
     * 在servlet对象创建时执行
     *      ① servlet创建几次？
     *          每个name配置，都会创建一次
     *
     *      ② servlet什么时候创建？
     *          默认情况下，第一次访问是创建
     *          当我们配置了loadOnStartup属性值为非负整数时，在服务器启动时创建
     *
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init....");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 当资源被访问时都会执行
     *      注意：因为该方法执行时，都是同一个Servlet对象，所以这个对象的成员数据如果在该方法中存在写操作
     *        就会出现并发安全问题。这个并发安全问题不可以采用加锁的方式解决，针对这个问题我们只能规避 -- 不要针对成员数据进行写操作
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service....");

        String name = servletRequest.getParameter("name");

        //赋值用户传递进来的name给成员变量name属性
//        this.name = name;

        //模拟业务耗时
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //将成员变量的name值用response对象写回到页面
        servletResponse.setContentType("text/html;charset=utf-8");
//        servletResponse.getWriter().write("当前访问用户为：" + this.name);
        servletResponse.getWriter().write("当前访问用户为：" + name);
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * 当Servlet被销毁时执行，一个对象执行一次
     *      什么时候销毁？
     *          关闭web容器时，或者将项目从web容器中移除
     */
    @Override
    public void destroy() {
        System.out.println("destroy....");
    }
}
